《出一套iOS高级面试题》实战题 解答
J_Knight_大神的《出一套 iOS 高级面试题》实战题 解答
原文
AppDelegate如何瘦身?
有以下方法:
- 通过创建分类,将一些第三方初始化以及创建的代码抽离到AppDelegate的分类当中,实现AppDelegate的瘦身。
- 通过实现ModuleManager类,来管理需要在AppDelegate中启动的繁多的模块。首先在软件启动时通过读取配置文件(通常用plist)读取模块,在AppDelegate的每个事件接收到响应的时,在对应方法中逐一调用已注册的模块对应的响应方法。具体可以参考 FRDModuleManager
反射是什么?可以举出几个应用场景么?(知道多少说多少)
系统Foundation框架为我们提供了一些方法反射的API,我们可以通过这些API执行将字符串转为SEL等操作。由于OC语言的动态性,这些操作都是发生在运行时的。
/ SEL和字符串转换
FOUNDATION_EXPORT NSString *NSStringFromSelector(SEL aSelector);
FOUNDATION_EXPORT SEL NSSelectorFromString(NSString *aSelectorName);
// Class和字符串转换
FOUNDATION_EXPORT NSString *NSStringFromClass(Class aClass);
FOUNDATION_EXPORT Class __nullable NSClassFromString(NSString *aClassName);
// Protocol和字符串转换
FOUNDATION_EXPORT NSString *NSStringFromProtocol(Protocol *proto) NS_AVAILABLE(10_5, 2_0);
FOUNDATION_EXPORT Protocol * __nullable NSProtocolFromString(NSString *namestr) NS_AVAILABLE(10_5, 2_0);
通过这些方法,我们可以在运行时选择创建那个实例,并动态选择调用哪个方法。
应用场景:
假设从服务器获取JSON串,通过这个JSON串获取需要创建的类为ViewController,并且调用这个类的getDataList方法。
Class class = NSClassFromString(@"ViewController");
ViewController *vc = [[class alloc] init];
SEL selector = NSSelectorFromString(@"getDataList");
[vc performSelector:selector];
有哪些场景是NSOperation比GCD更容易实现的?(或是NSOperation优于GCD的几点,知道多少说多少)
NSOperation相对于GCD:
- NSOperationQueue可以设置各个NSOperation之间的依赖关系。
- NSOperationQueue支持KVO,可以监测operation是否正在执行(isExecuted)、是否结束(isFinished),是否取消(isCanceld)
- GCD 只支持FIFO 的队列,而NSOperationQueue可以调整队列的执行顺序(通过调整权重)。NSOperationQueue可以方便的管理并发、NSOperation之间的优先级。
使用场景:
NSOperation:各个操作之间有依赖关系、操作需要取消暂停、并发管理、控制操作之间优先级,限制同时能执行的线程数量.让线程在某时刻停止/继续等。
GCD:一般的需求很简单的多线程操作,用GCD都可以了,简单高效。
参考
App 启动优化策略?最好结合启动流程来说(main()函数的执行前后都分别说一下,知道多少说多少)
- 利用DYLD_PRINT_STATISTICS分析main()函数之前的耗时
- 重新梳理架构,减少动态库、ObjC类的数目,减少Category的数目
- 定期扫描不再使用的动态库、类、函数,例如每两个迭代一次
- 用dispatchonce()代替所有的attribute((constructor))函数、C++静态对象初始化、ObjC的+load
- 在设计师可接受的范围内压缩图片的大小,会有意外收获
- 利用锚点分析applicationWillFinishLaunching的耗时
- 将不需要马上在applicationWillFinishLaunching执行的代码延后执行
- rootViewController的加载,适当将某一级的childViewController或subviews延后加载
- 如果你的App可能会被后台拉起并冷启动,可考虑不加载rootViewController
- 不应放过的一些小细节
- 异步操作并不影响指标,但有可能影响交互体验,例如大量网络请求导致数据拥堵
- 有时候一些交互上的优化比技术手段效果更明显,视觉上的快决不是冰冷的数据可以解释的,好好和你们的设计师谈谈动画
参考
App 无痕埋点的思路了解么?你认为理想的无痕埋点系统应该具备哪些特点?(知道多少说多少)
iOS无埋点的核心技术是利用苹果的runtime机制,把系统事件、点击事件的指针替换成我们自己的函数来监测用户的操作,我们在自己的函数中采集并发送需要的数据。
参考
你知道有哪些情况会导致app崩溃,分别可以用什么方法拦截并化解?(知道多少说多少)
- unrecognized selector crash
- KVO crash
- NSNotification crash
- NSTimer crash
- Container crash(数组越界,插nil等)
- NSString crash (字符串操作的crash)
- UI not on Main Thread Crash